package jnh;

import java.util.Enumeration;

import javax.media.j3d.Behavior;
import javax.media.j3d.WakeupOnElapsedTime;
import javax.vecmath.Quat4f;

import obj.Balle;
import obj.Barre;
import obj.Joueur;
import phyzik.solides.PhysiqueSolide;
import struct.Intervalle;
import coeur.Equipe;

public class JNH extends Behavior {
	private static final int DELAI = 100;

	protected WakeupOnElapsedTime reveil;
	protected Equipe equipe;
	protected Balle balle;
	protected Barre barreActuelle;
	protected Joueur[] joueurs;
	protected Intervalle[] intervalles;

	protected PhysiqueSolide physiqueActuelle;
	protected PhysiqueSolide physiqueBalle;

	protected Oracle oracle;
	protected float dt;
	
	protected float dec;
	protected float ang;

	public JNH(Equipe eq, Balle balle, float dt, int i) {
		this.equipe = eq;
		this.balle = balle;
		barreActuelle = equipe.getBarres()[i];
		joueurs = barreActuelle.getJoueurs();
		intervalles = new Intervalle[joueurs.length];
		physiqueActuelle = barreActuelle.getPhysique();
		physiqueBalle = balle.getPhysique();
		oracle = new Oracle(physiqueBalle);
		this.dt = dt;
		reveil = new WakeupOnElapsedTime(DELAI);
	}

	public void initialize() {
		wakeupOn(reveil);
	}

	@SuppressWarnings("unchecked")
	public void processStimulus(Enumeration enu) {
		action();
		wakeupOn(reveil);
	}

	private void action() {
		physiqueActuelle = barreActuelle.getPhysique();
		choisirMouvement();
		corrigerMouvement();
		Quat4f rot = new Quat4f(0f, (float) Math.sin(ang), 0f, (float) Math
				.cos(ang));
		physiqueActuelle.orientation.mul(rot);
		physiqueActuelle.orientation.normalize();
		physiqueActuelle.position.y += dec;
	}

	public void choisirMouvement() {
		float positionBalle = physiqueBalle.position.y;
		if (physiqueBalle.vitesse.length() != 0) {
			positionBalle = oracle.deviner(dt/physiqueBalle.vitesse.length());
		}
		float positionJoueur = joueurs[0].physique.position.y;
		float dist = 0;

		boolean premier = true;
		int actif = -1;

		for (int i = 0; i<joueurs.length; i++) {
			joueurs[i].apparenceOrigine();
			if (premier) {
				premier = false;
				dist = Math.abs(positionBalle - positionJoueur);
				actif = i;
			}
			else {
				if (Math.abs(positionBalle - joueurs[i].physique.position.y) < dist) {
					positionJoueur = joueurs[i].physique.position.y;
					dist = Math.abs(positionBalle - positionJoueur);
					actif = i;
				}					
			}
		}

		if (actif!=-1) {
			if (Math.abs(positionBalle - positionJoueur) < 0.2f) {
				dec = positionBalle - positionJoueur;
			}
			else {
				dec = Math.signum(positionBalle - positionJoueur)*0.2f;
			}
			joueurs[actif].changerApparence();
		}
		ang = 0;
		if (actif!=-1 && Math.abs(physiqueBalle.position.x - joueurs[actif].physique.position.x) < 1f && Math.abs(physiqueBalle.position.y - joueurs[actif].physique.position.y) < 1f && Math.abs(physiqueBalle.position.z - joueurs[actif].physique.position.z) < 5f) {
			ang  = -Math.signum(physiqueBalle.position.x - joueurs[actif].physique.position.x)*0.3f;
		}
	}

	public void choisirMouvementNaif() {
		dec = Math.min(balle.getPhysique().position.y
				- barreActuelle.getJoueurs()[0].physique.position.y, 0.2f);
	}

	public void corrigerMouvement() {
		if (dec + physiqueActuelle.position.y > barreActuelle.I.b)
			dec = 0;
		if (dec + physiqueActuelle.position.y < barreActuelle.I.a)
			dec = 0;
	}
}
